using System.Data;
using GeneratorCustomization;

namespace Descriptors.GeneratorCustomization
{
    /// <summary>
    /// Container for all tables that are lookup tables.
    /// For these tables, some things should be generated differently, 
    /// e.g. a GetAll method should cache the result set.
    /// </summary>
    public class LookupTable
    {
        private readonly string _database;
        private readonly string _diplayColumn;
        private readonly string _table;
  
        /// <summary>
        /// Gets the name of the table that contains lookup table customization data.
        /// </summary>
        public const string TableName = "LookupTable";

        /// <summary>
        /// Create with customization data
        /// </summary>
        private LookupTable(DataRow row)
            : this(row["Database"].ToString(), row["TableName"].ToString(), row["DisplayColumn"].ToString())
        {
        }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="database">Name of the database the table is in.</param>
        /// <param name="table">Name of the table the column is in.</param>
        /// <param name="displayColumn">Name of the display column.</param>
        private LookupTable(string database, string table, string displayColumn)
        {
            _database = database;
            _table = table;
            _diplayColumn = displayColumn;
        }

        /// <summary>
        /// Name of the display column (i.e. the one to display to the user.).
        /// </summary>
        public string DisplayColumn
        {
            get { return _diplayColumn; }
        }

        /// <summary>
        /// Name of the table the special column is in.
        /// </summary>
        /// <remarks>If this is an empty string then the special rule should apply to ALL tables.</remarks>
        public string Table
        {
            get { return _table; }
        }

        /// <summary>
        /// Name of the database the table is in.
        /// </summary>
        /// <remarks>If this is an empty string then the special rule should apply to ALL tables in ALL databases.</remarks>
        public string Database
        {
            get { return _database; }
        }

        /// <summary>
        /// Instantiate a new excluded table column with all required fields.
        /// </summary>
        /// <param name="database">Name of the database the table is in.</param>
        /// <param name="table">Name of the table the column is in.</param>
        /// <param name="displayColumn">Name of the display column.</param>
        /// <returns></returns>
        public static LookupTable Build(string database, string table, string displayColumn)
        {
            return new LookupTable(database, table, displayColumn);
        }

        /// <summary>
        /// Instantiate a new excluded table column with all required fields.
        /// </summary>
        /// <param name="database">Name of the database the table is in.</param>
        /// <param name="table">Name of the table the column is in.</param>
        public static LookupTable Build(string database, string table)
        {
            DataRow row = GeneratorsData.TableMatchGetRow(TableName, database, table, true);
            if (row == null)
                return null;
            LookupTable lookupTable = new LookupTable(row);
            return lookupTable;
        }

        #region Nested type: Testing

        /// <summary>
        /// Support methods for testing use only
        /// </summary>
        public class Testing
        {
            /// <summary>
            /// Get the test excluded column. Details are:-
            /// TestDatabase; TestTable; TestColumn
            /// </summary>
            /// <returns></returns>
            public static LookupTable GetTestColumn()
            {
                return Build("TestDatabase", "TestTable", "TestColumn");
            }
        }

        #endregion
    }
}